iT邦幫忙

2

🐳 從零部署 Cronicle:我用 Docker 打造了自己的排程大腦

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20250626/20155103FV4Xxc5eLm.png

⚙️ 初識 Cronicle:想找一個能排程又有介面的工具

有一天,我在找一個「有網頁介面、支援多任務排程」的工具時,看見了 Cronicle。
看起來比 Linux 的 crontab 好懂一些,而且也能管理多台主機,我決定動手實作。

這篇記錄了我如何從一台乾淨的 Ubuntu 終端機,部署一套可自動備份、可遠端瀏覽的 Cronicle 系統。


🛠️ 安裝流程紀錄:從 Node.js 到 Docker Compose

在閱讀官方文件後,我發現有兩種方式可以安裝 Cronicle:

方式 特點
curl 安裝原生版 適合有 root 權限、想直接部署在本機的使用者
Docker 版(含 Compose) 適合用容器管理、未來好備份與升級

我選擇了第二種:使用 soulteary/docker-cronicle 這個社群提供的 Docker 封裝版本。

下面是我實際操作的流程:

  1. 安裝 Docker 和 Docker Compose(透過 apt)
  2. git clone https://github.com/soulteary/docker-cronicle.git
  3. cd docker-cronicle
  4. 編輯 docker-compose.yml,我確認了這段:
    volumes:
      - ./data:/opt/cronicle/data
    
  5. 執行 docker compose up -d,幾分鐘後看到容器啟動完成。

🌐 啟動成功!開啟瀏覽器就能排程

透過 docker ps 我查到容器的 3012 port 已對外開放,從同網段的電腦上打開 http://10.122.23.xxx:3012 就能進入 Cronicle 的 Web UI。
預設帳密是 admin / admin,建議第一時間改密碼。


🧠 Cronicle 的資料保存機制與踩雷情境

所有設定資料都存在 /opt/cronicle/data,這也是為什麼「volume 映射」非常關鍵。

以下是一些需要注意的情況與建議:

情境 風險 解法
沒設 volume 映射 容器刪除後資料會消失 - ./data:/opt/cronicle/data 保護
誤刪 ./data 資料永久消失 建議定期 tar 備份
volume 掛錯路徑 容器重建時資料歸零 確認 compose 設定與路徑一致
Docker 映像版本變更太快 舊資料格式不兼容 建議固定 tag,不用 latest
容器內部誤刪 /opt/cronicle/data 主機資料同步被刪 除非必要,避免進容器直接操作

📦 Cronicle 自動備份自己

我設計了一支 shell script,讓 Cronicle 每天凌晨備份自己的資料夾。

#!/bin/bash
BACKUP_DIR="/opt/cronicle-backup"
SOURCE_DIR="/opt/cronicle/data"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/cronicle_backup_${TIMESTAMP}.tar.gz"

mkdir -p "${BACKUP_DIR}"
tar -czf "${BACKUP_FILE}" -C "${SOURCE_DIR}" .
find "${BACKUP_DIR}" -type f -name "*.tar.gz" -mtime +7 -delete

把它掛進 volume,再到 Cronicle 裡建一個 Shell Script 類型的 Job 就能定期備份。


⚠️ Cronicle 對「Web 任務」的錯誤判斷,其實很有限

如果你用的是「Web Plugin」來呼叫 HTTP 任務(例如 .ashx),只要回傳的是 HTTP 200,就算內容有錯誤,Cronicle 也會當成功。

我原本寫了一支 CheckHostStatus.ashx,會檢查多台主機的狀態、寫入資料庫、發 LINE 通知,但 HTTP 回應始終是 200。

解法有兩種:

  • .ashx 中偵測是否有錯誤,若有就設 Response.StatusCode = 500
  • 改用 Shell Plugin 呼叫 curl,並用 shell script 判斷回應結果後用 exit 1 控制錯誤判定

後來我選擇在程式末加上這段:

if (hasAnyError)
{
    context.Response.StatusCode = 500;
    context.Response.StatusDescription = "Host check failed";
}

讓 Cronicle 能正確判斷任務是否真的成功。

但如果你的 .ashx 已經包了所有邏輯、紀錄與告警,其實讓 Cronicle 當作「每天來觸發一次的鬧鐘」就好,也不需要它來判斷結果成敗。


🧰 適合詢問 GPT 的 Prompts 範例

如何在 Docker 中部署 Cronicle 並持久化資料?

請幫我建立 Cronicle 的備份腳本與排程設定

docker-compose.yml 怎麼寫才能保存設定與日誌?

cronicle 如何在多台機器之間同步?

cronicle 的 config.json 哪些欄位必須要設?


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言